package com.rede.didiok.common.utils.admin;

import java.util.concurrent.TimeUnit;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.TypeReference;
import com.rede.didiok.common.constant.conf.MessageConf;
import com.rede.didiok.common.constant.conf.RedisConf;
import com.rede.didiok.common.constant.global.ErrorCode;
import com.rede.didiok.common.dto.admin.SystemConfigDto;
import com.rede.didiok.common.exception.exceptionType.QueryException;
import com.rede.didiok.common.feign.AdminFeignClient;
import com.rede.didiok.common.utils.JsonUtils;
import com.rede.didiok.common.utils.R;
import com.rede.didiok.common.utils.RedisUtil;
import com.rede.didiok.common.utils.StringUtils;

/**
 * @Author: Rede
 * @DateTime: 2023-09-15 7:13
 * @Description: SystemConfig相关业务支持类
 */
@Slf4j
@Component
public class SystemConfigUtil {

    @Autowired
    private AdminFeignClient adminFeignClient;

    @Autowired
    private RedisUtil redisUtil;

    /**
     * 获取系统配置
     *
     * @return
     */
    public SystemConfigDto getSystemConfig() {
        // 从Redis中获取系统配置
        // TODO 注意一下：redis中如果存储的是 SystemConfigEntity，从redis中再获取是否可以用SystemConfigDto接收
        String systemConfigJson = redisUtil.get(RedisConf.SYSTEM_CONFIG);
        if (StringUtils.isEmpty(systemConfigJson)) {
            R configResult = adminFeignClient.getSystemConfig();
            SystemConfigDto systemConfig = null;
            if (configResult.getCode()==0) {
                systemConfig = configResult.getData(new TypeReference<SystemConfigDto>(){});
            }
            if (systemConfig == null) {
                throw new QueryException(MessageConf.SYSTEM_CONFIG_IS_NOT_EXIST);
            } else {
                // 将系统配置存入Redis中【设置过期时间24小时】
                redisUtil.setEx(RedisConf.SYSTEM_CONFIG, JsonUtils.objectToJson(systemConfig), 24, TimeUnit.HOURS);
            }
            return systemConfig;
        } else {
            SystemConfigDto systemConfig = JsonUtils.jsonToPojo(systemConfigJson, SystemConfigDto.class);
            if (systemConfig == null) {
                throw new QueryException(ErrorCode.QUERY_DEFAULT_ERROR, "系统配置转换错误，请检查系统配置，或者清空Redis后重试！");
            }
            return systemConfig;
        }
    }

}
